package easy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/*
859. 亲密字符串
解题思路：
1.若两长度不相等，可直接判断为FALSE；
2.若两字符串内容想通，有重复字符即为TRUE；
3.若长度相等且内容不等，找不同字符对应的下标，若下标数量不为2则为FALSE，否则交换这两个下标的字符以后再和另一个字符串比较内容是否相同。
 */
public class LeeCode859 {

  public boolean buddyStrings(String s, String goal) {

//    1.若两长度不相等，可直接判断为FALSE；
    if (s.length() != goal.length()){
      return false;
    }

//    2.若两字符串内容想通，有重复字符即为TRUE；
    Map<Character,Integer> map = new HashMap<>();

    if(s.equals(goal)){
      for (char c : s.toCharArray()) {
        map.put(c,map.getOrDefault(c,0)+1);
      }
      for (Character character : map.keySet()) {
        if (map.get(character) > 1){
          return true;
        }
      }
      return false;
    }


    //  3.若长度相等且内容不等，找不同字符对应的下标，若下标数量不为2则为FALSE，否则交换这两个下标的字符以后再和另一个字符串比较内容是否相同。
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < s.length(); i++) {
      if (s.charAt(i) != goal.charAt(i)){
        list.add(i);
      }
    }
    if (list.size()!=2){
      return false;
    }

    char[] c = s.toCharArray();
    int index1 = list.get(0);
    int index2 = list.get(1);
    char tmp = c[index1];
    c[index1] = c[index2];
    c[index2] = tmp;
    return new String(c).equals(goal);
  }



  public static void main(String[] args) {

    System.out.println(new LeeCode859().buddyStrings("abcc", "bacc"));

  }
}
